C++ 赋值运算符重载

就像其他运算符一样,您可以重载赋值运算符( = ),用于创建一个对象,比如拷贝构造函数。

下面的实例演示了如何重载赋值运算符。

      #include <iostream>
      using namespace std;

      class Distance
      {
         private:
            int feet;             // 0 到无穷
            int inches;           // 0 到 12
         public:
            // 所需的构造函数
            Distance(){
               feet = 0;
               inches = 0;
            }
            Distance(int f, int i){
               feet = f;
               inches = i;
            }
            void operator=(const Distance &D )
            { 
               feet = D.feet;
               inches = D.inches;
            }
            // 显示距离的方法
            void displayDistance()
            {
               cout << "F: " << feet <<  " I:" <<  inches << endl;
            }

      };
      int main()
      {
         Distance D1(11, 10), D2(5, 11);

         cout << "First Distance : "; 
         D1.displayDistance();
         cout << "Second Distance :"; 
         D2.displayDistance();

         // 使用赋值运算符
         D1 = D2;
         cout << "First Distance :"; 
         D1.displayDistance();

         return 0;
      }

当上面的代码被编译和执行时,它会产生下列结果:

      First Distance : F: 11 I:10
      Second Distance :F: 5 I:11
      First Distance :F: 5 I:11

当用户自定义类型变量向内置类型变量赋值时,可以使用自定义类型的隐式转换。

      #include<iostream>
      using namespace std;
      class Int{
        private:
          int n;
        public:
          Int(int i);
          operator int() // 这里就是隐式转换声明,应注意到它与运算符重载的不同之处
          {
             return n;
          }
      }
      int main()
      {
        Int a(5);
        int c=a; // 隐式调用转换函数
        cout<<c<<endl;
        cout<<a<<endl; // 由于未重载Int的<<操作符,将隐式调用转换函数
      }

上述代码的输出将为:

      5
      5

注意谨慎使用隐式转换函数,因为当你在不需要使用转换函数时,这些函数却可能会被调用运行;这些不正确的程序会做出一些意想不到的事情,而你又很难判断出原因。

🔚